﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

using Mono.XNA.Input;

namespace Mono.XNA.Scene
{
    public  class SceneManager : DrawableGameComponent
    {
        #region プロパティ

        /// <summary>
        /// すべてのシーンで共有されるSpriteBatch
        /// </summary>
        public static SpriteBatch SpriteBatch
        {
            get { return spriteBatch; }
        }
        static SpriteBatch spriteBatch;



        /// <summary>
        /// とりあえず共有されるフォント
        /// </summary>
        public static  SpriteFont Font
        {
            get { return font; }
        }
        static SpriteFont font;

        /// <summary>
        /// 共有されるコンテンツマネージャ
        /// </summary>
        public static ContentManager Content
        {
            get { return content; }
        }
        static ContentManager content;

        /// <summary>
        /// シーンを格納したコレクション
        /// </summary>
        public static List<Scene> SceneList
        {
            get { return sceneList; }
        }
        //シーンインスタンスを格納するコレクション。
        private static List<Scene> sceneList = new List<Scene>();

        ///// <summary>
        ///// 現在フォーカスの当たっているシーン
        ///// </summary>
        //public AScene SceneFocus
        //{
        //    set { sceneFocus = value; }
        //}
        //AScene sceneFocus;

        public static Game GameObject
        {
            get;
            private set;
        }
        
        #endregion



        #region 初期化

        public SceneManager(Game game)
            : base(game)
        {

            content = new ContentManager(Game.Services);
            content.RootDirectory = "Content";
            GameObject = this.Game;
        }

        /// <summary>
        /// マネージャの初期化処理
        /// </summary>
        public override void Initialize()
        {

            base.Initialize();
        }

        /// <summary>
        /// マネージャ内共通で使うリソースの読み込みを行う。
        /// </summary>
        protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(Game.GraphicsDevice);
            font = Content.Load<SpriteFont>("DefaultFont");
            ContentManager content = Game.Content;

            base.LoadContent();
        }

        #endregion


        #region メソッド

        /// <summary>
        /// シーンのアップデート処理を行う。
        /// </summary>
        /// <param name="gameTime"></param>
        public override void Update(GameTime gameTime)
        {
            InputState.Update();
            foreach (Scene scene in sceneList)
            {
                scene.Update();
            }


            
            base.Update(gameTime);
        }

        /// <summary>
        /// シーンの描画処理を行う。
        /// </summary>
        /// <param name="gameTime"></param>
        public override void Draw(GameTime gameTime)
        {
            Game.GraphicsDevice.Clear(Color.CornflowerBlue);

            foreach (Scene scene in sceneList)
            {
                scene.Draw();
            }
            
            base.Draw(gameTime);
        }

        /// <summary>
        /// 読み込んだリソースの開放を行う。
        /// </summary>
        protected override void UnloadContent()
        {
            base.UnloadContent();
        }

        /// <summary>
        /// シーンをリストに追加する。
        /// </summary>
        /// <param name="scene">追加するシーンオブジェクト。</param>
        public void AddScene(Scene scene)
        {
            sceneList.Add(scene);
        }

        #endregion
    }
}
